package cn.itsource.pethome.basic.service.impl;

import cn.itsource.pethome.user.constant.PhoneConstant;
import cn.itsource.pethome.basic.service.IVerificationCodeService;
import cn.itsource.pethome.basic.util.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 *  获取验证码
 */
@Service
public class VerificationCodeServiceImpl implements IVerificationCodeService {
    /**
     * 注册获取验证码
     * @param phone 手机号
     * @return
     */
    @Override
    public AjaxResult sendPhoneCode(String phone) {
        //注册获取验证码
        AjaxResult ajaxResult = sendCode(PhoneConstant.Phone_Reg, phone);
        return ajaxResult;
    }

    /**
     * 登录获取验证码
     *
     * @param phone 手机号
     * @return
     */
    @Override
    public AjaxResult sendLoginPhoneCode(String phone) {
        //注册获取验证码
        AjaxResult ajaxResult = sendCode(PhoneConstant.Phone_Login, phone);
        return ajaxResult;
    }

    /**
     * 获取验证码
     * @param constant 是注册还是登录
     * @param phone 手机号
     * @return  提示信息
     */
    public AjaxResult sendCode(String constant, String phone){
            //1、获取redis中的存的value值（包含验证码和时间戳）
            String value = RedisUtils.INSTANCE.get(constant +":"+phone);
            //获取四位数随机验证码
            String code = StrUtils.getComplexRandomString(4);

            System.out.println("=================="+StringUtils.isNotBlank(value));
            //判断value不等于null或者空
            if (StringUtils.isNotBlank(value)){
                //获取当前时间戳
                long currentTimeMillis = System.currentTimeMillis();
                //根据：进行分割,截取value中的时间戳  Phone_Reg:321441234123
                String beforeTime = value.split(":")[1];
                //再次判断请求是否小于一分钟
                if (currentTimeMillis - Long.valueOf(beforeTime) < 60 * 1000) {
                    return new AjaxResult(false, "请不要在一分钟内发送多次");
                }else {
                    //如果大于一分钟小于5分钟，我们发送相同的验证码,给code 重新赋值
                    code = value.split(":")[0];
                }
            }
            //存储到redis,key  等于Phone_Reg 加上手机号方便区分是注册还是登录，value 等于验证码加上时间戳
            //1、便于判断是否在一分钟内发送多次请求，并且小于5分钟，提示用户多次发送请求
            //2、如果大于一分钟小于5分钟，我们发送相同的验证码
            //5*60  设置五分钟有效
            RedisUtils.INSTANCE.set(constant + ":"+phone,code+":"+System.currentTimeMillis(),5*60);
            //发送短信,传入手机号和验证码
            //SmsUtil.sendMessage(phone, code);
            System.out.println("您的验证码是" + code);
            return new AjaxResult();
    }

}
